package com.atguigu.gmall.ums.service.impl;

import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.UUID;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.atguigu.gmall.common.bean.PageResultVo;
import com.atguigu.gmall.common.bean.PageParamVo;

import com.atguigu.gmall.ums.mapper.UserMapper;
import com.atguigu.gmall.ums.entity.UserEntity;
import com.atguigu.gmall.ums.service.UserService;



@Service("userService")
public class UserServiceImpl extends ServiceImpl<UserMapper, UserEntity> implements UserService {

    @Override
    public PageResultVo queryPage(PageParamVo paramVo) {
        IPage<UserEntity> page = this.page(
                paramVo.getPage(),
                new QueryWrapper<UserEntity>()
        );

        return new PageResultVo(page);
    }

    @Override
    public Boolean checkData(String data, Integer type) {
        //本质是在数据库查询是否有该记录
        QueryWrapper<UserEntity> wrapper = new QueryWrapper<>();
        //根据1，用户名；2，手机；3，邮箱 对比查询
        switch (type) {
            case 1:
                wrapper.eq("username", data);
                break;
            case 2:
                wrapper.eq("phone", data);
                break;
            case 3:
                wrapper.eq("email", data);
                break;
            default:
                return null; //没有对应则返回null
        }
        return this.count(wrapper) == 0; //返回数据等于0 表示可用
    }

    @Override
    public void register(UserEntity userEntity,String code) {
        //todo 校验验证码

        //生成盐  正常情况下使用工具类
        String salt = StringUtils.substring(UUID.randomUUID().toString(), 0, 6);
        userEntity.setSalt(salt);

        //加盐加密
        String passWord = DigestUtils.md5Hex(userEntity.getPassword() + salt);
        userEntity.setPassword(passWord);

        //新增用户
        userEntity.setNickname(userEntity.getUsername());
        userEntity.setLevelId(1l);
        userEntity.setSourceType(1);
        userEntity.setGrowth(1000);
        userEntity.setIntegration(1000);
        userEntity.setStatus(1);
        userEntity.setCreateTime(new Date());

        this.save(userEntity);

        //todo 删除短信验证码
    }

    //数据库内保存的密码是经过加密的,无法直接进行查询
    @Override
    public UserEntity queryUser(String loginName, String password) {
        //根据登录名进行查询 获取对应的盐
        QueryWrapper<UserEntity> wrapper = new QueryWrapper<>();
        wrapper.eq("username", loginName)
                .or().eq("phone",loginName)
                .or().eq("email",loginName);
        UserEntity userEntity = this.getOne(wrapper);

        //判空,如果查询的用户为空,说明登录名错误
        if (userEntity == null){
            //throw new RuntimeException("您输入的用户名有误");
            return null;
        }

        //根据盐 和 明文密码 加密
         password = DigestUtils.md5Hex(password + userEntity.getSalt());

        //对比数据库保存的密码  如果不一致说明密码有误
        if (!StringUtils.equals(password, userEntity.getPassword())){
            //throw new RuntimeException("您输入的密码有误");
            return null;
        }

        //返回用户信息
        return userEntity;
    }

}